/**
 * 
 */
package com.cn.practice.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 享元模式通常采用享元工厂来实现享元对象的构建
 * 常用在池操作 比如连接池 Integer的-128到127的缓存池
 * 目的就是减少具体实例的构建
 * @author zhangyang
 *
 */
public class FlyweightPractice2 {
public static void main(String[] args) {
	/**
	 * 发布一个小网站 有报纸 网络两种发布方式。但是如果我们发布很多那么就很占资源
	 * 所以我们设计一个发布池，每次谁需要就去池里找一个给他使用
	 */
	SoftWareFactory factory = new SoftWareFactory();
	SoftWare1 elements = factory.getElements("报纸");
	elements.Use(new User1("张三"));
	SoftWare1 elements1 = factory.getElements("报纸");
	elements1.Use(new User1("李四"));
	System.out.println(factory.getAllElements());
}
}

/**
 * 抽象方法-软件
 * 定义抽象方法使用拿到内部属性对象
 * @author zhangyang
 *
 */
 abstract class SoftWare1{
	String name;
	public abstract void Use(User1 user);
}


/**
 * 软件的用户-内部属性
 * @author zhangyang
 *
 */
class User1{
	String name;

	public User1(String name) {
		super();
		this.name = name;
	}

	@Override
	public String toString() {
		return "User1 [name=" + name + "]";
	}
	
	
}

/**
 * 发布软件-具体享元对象
 * @author zhangyang
 *
 */
class ConcretSoftWare1 extends SoftWare1{
	 String type;

	 
	public ConcretSoftWare1(String type) {
		super();
		this.type = type;
	}


	@Override
	public void Use(User1 user) {
		// TODO Auto-generated method stub
		System.out.println("当前发布方式是"+type+"_使用人"+user);
	}
}
/**
 * 享元工厂，用以构建具体发布对象
 * @author zhangyang
 *
 */
class SoftWareFactory{
	Map<String,SoftWare1> elements=new HashMap<>();
	SoftWare1 getElements(String type) {
		if(!elements.containsKey(type)) {
			elements.put(type, new ConcretSoftWare1(type));
		}
		return elements.get(type);
	}
	int getAllElements() {
		return elements.size();
	}
}